# 简易 Makefile
# 需要：
#   clang llvm-strip bpftool (生成 vmlinux.h 或内核已提供)
#   pkg-config (libbpf)
#
# 若系统提供 /usr/include/bpf/vmlinux.h 则不必重新生成。
#
# 生成 vmlinux.h 示例（若未提供）:
#   bpftool btf dump file /sys/kernel/btf/vmlinux > /tmp/vmlinux.raw
#   bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h
#
# 这里假设已把 vmlinux.h 放到当前目录或系统路径（如内核 headers）。

BPF_CLANG ?= clang
BPF_LLVM_STRIP ?= llvm-strip
CFLAGS_USER ?= -O2 -g -Wall -Werror
BPF_CFLAGS ?= -O2 -g -target bpf -D__TARGET_ARCH_x86
# 如果是 arm64 则把 -D__TARGET_ARCH_x86 换成 -D__TARGET_ARCH_arm64

LIBBPF_CFLAGS ?= $(shell pkg-config --cflags libbpf 2>/dev/null)
LIBBPF_LDLIBS ?= $(shell pkg-config --libs libbpf 2>/dev/null)
# 如果没有 pkg-config，可手动： -I/usr/include -lbpf -lelf -lz

SRC_DIR = ./
BPF_OBJ = bpf_handle_try_charge_memcg.bpf.o
USER_BIN = loader

all: $(BPF_OBJ) $(USER_BIN)

$(BPF_OBJ): $(SRC_DIR)/bpf_handle_try_charge_memcg.bpf.c
	$(BPF_CLANG) $(BPF_CFLAGS) -c $< -o $@
	$(BPF_LLVM_STRIP) -g $@

$(USER_BIN): $(SRC_DIR)/loader2.c
	$(CC) $(CFLAGS_USER) $< -o $@ $(LIBBPF_CFLAGS) $(LIBBPF_LDLIBS) -lelf -lz

clean:
	rm -f $(BPF_OBJ) $(USER_BIN)

.PHONY: all clean
